]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
grabHelper: Use Clutter.grab() underneath
authorCarlos Garnacho <carlosg@gnome.org>
Wed, 17 Nov 2021 23:56:44 +0000 (00:56 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Sat, 29 Jan 2022 00:16:30 +0000 (01:16 +0100)
This is subject to further possible simplifications. Use Clutter.grab
to redirect input and focus, a fundamental difference here is that
we do redirect input to the topmost owner of the grabhelper stack,
instead of the stage. This is better behaved with the presence of
other grabs, at the cost of some behavioral changes.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2045>

js/ui/grabHelper.js

index e70285bdee16483d99bd4abbaaa5bb9b32cc9e55..89e1bee3216f4fa1c29b7b1b37457efd8b899f34 100644 (file)
@@ -6,31 +6,6 @@ const { Clutter, St } = imports.gi;
 const Main = imports.ui.main;
 const Params = imports.misc.params;
 
-let _capturedEventId = 0;
-let _grabHelperStack = [];
-function _onCapturedEvent(actor, event) {
-    let grabHelper = _grabHelperStack[_grabHelperStack.length - 1];
-    return grabHelper.onCapturedEvent(event);
-}
-
-function _pushGrabHelper(grabHelper) {
-    _grabHelperStack.push(grabHelper);
-
-    if (_capturedEventId == 0)
-        _capturedEventId = global.stage.connect('captured-event', _onCapturedEvent);
-}
-
-function _popGrabHelper(grabHelper) {
-    let poppedHelper = _grabHelperStack.pop();
-    if (poppedHelper != grabHelper)
-        throw new Error("incorrect grab helper pop");
-
-    if (_grabHelperStack.length == 0) {
-        global.stage.disconnect(_capturedEventId);
-        _capturedEventId = 0;
-    }
-}
-
 // GrabHelper:
 // @owner: the actor that owns the GrabHelper
 // @params: optional parameters to pass to Main.pushModal()
@@ -209,7 +184,10 @@ var GrabHelper = class GrabHelper {
             if (!Main.pushModal(this._owner, this._modalParams))
                 return false;
 
-            _pushGrabHelper(this);
+            this._capturedEventId = this._owner.connect('captured-event',
+                (actor, event) => {
+                    return this.onCapturedEvent(event);
+                });
         }
 
         this._modalCount++;
@@ -221,8 +199,7 @@ var GrabHelper = class GrabHelper {
         if (this._modalCount > 0)
             return;
 
-        _popGrabHelper(this);
-
+        this._owner.disconnect(this._capturedEventId);
         this._ignoreUntilRelease = false;
 
         Main.popModal(this._owner);